﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ComunesMGI.DataTypes;
using ComunesMGI.Constantes;
using ComunesMGI.Excepciones;
using System.Data;
using System.Configuration;


namespace MGI.AccesoDatos.AccesoBD
{
    class BDWorkPackages
    {
        public int AddWorkPackage(int idSistema, DataWP workPackage)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            string textoComando = "DarEstadoInicialWP";
            SqlCommand cmdEstIni = new SqlCommand(textoComando, cnn);
            SqlDataReader lector;
            int afectados = -1;
            try
            {
                //obtenemos le estado inicial, con el que se dara de alta el wp
                cnn.Open();
                lector = cmdEstIni.ExecuteReader();
                int estadoInicial = 0;
                if (lector.Read())
                {
                    estadoInicial = (int)lector["WkpEstCod"];
                }
                else
                {
                    throw new NoExisteEstadoInicialException("No hay definido un estado inicial de Work Package");
                }
                lector.Close();

                //llamamos al stored procedure AgregarWorkPackage
               
                textoComando = "AgregarWorkPackage";


                SqlCommand cmd = new SqlCommand(textoComando, cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter nombreWP = new SqlParameter("@WkpNom", workPackage.Nombre);
                SqlParameter fchIniWP = new SqlParameter("@WkpFchIni", SqlDbType.DateTime);
                SqlParameter fchEntWP = new SqlParameter("@WkpFchEnt", SqlDbType.DateTime);
                SqlParameter fchEntEstWP = new SqlParameter("@WkpFchEntEst", SqlDbType.DateTime);
                SqlParameter fchFinWP = new SqlParameter("@WkpFchFin", SqlDbType.DateTime);
                SqlParameter estIniWP = new SqlParameter("@WkpEstCod ", estadoInicial);
                SqlParameter sisWP = new SqlParameter("@SisCod ", idSistema);
                if ((workPackage.FechaInicio).Equals(ConstantesMGI.FechaVacia))
                {
                    fchIniWP.IsNullable = true;
                    fchIniWP.Value = DBNull.Value;
                }
                else
                {
                    fchIniWP.Value = workPackage.FechaInicio;
                }
                if ((workPackage.FechaEntrega).Equals(ConstantesMGI.FechaVacia))
                {
                    fchEntWP.IsNullable = true;
                    fchEntWP.Value = DBNull.Value;
                }
                else
                {
                    fchEntWP.Value = workPackage.FechaEntrega;
                }
                if ((workPackage.FechaEstimadaEntrega).Equals(ConstantesMGI.FechaVacia))
                {
                    fchEntEstWP.IsNullable = true;
                    fchEntEstWP.Value = DBNull.Value;
                }
                else
                {
                    fchEntEstWP.Value = workPackage.FechaEstimadaEntrega;
                }
                if ((workPackage.FechaFin).Equals(ConstantesMGI.FechaVacia))
                {
                    fchFinWP.IsNullable = true;
                    fchFinWP.Value = DBNull.Value;
                }
                else
                {
                    fchFinWP.Value = workPackage.FechaFin;
                }

                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(nombreWP);
                cmd.Parameters.Add(fchIniWP);
                cmd.Parameters.Add(fchEntWP);
                cmd.Parameters.Add(fchEntEstWP);
                cmd.Parameters.Add(fchFinWP);
                cmd.Parameters.Add(estIniWP);
                cmd.Parameters.Add(sisWP);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                afectados = (int)cmd.Parameters["@retorno"].Value;

                if (afectados == 0)
                {
                    throw new YAExisteRegistroException("Ya existe un work package con ese nombre para el sistema del cliente");
                }
                else if (afectados == -1)
                {
                    throw new Exception("Problemas en la base de datos");
                }
                
            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }
            return afectados;
        }

        public List<DataWP> GetWorkPackages(int sisCod)
        {
            List<DataWP> listaWP = new List<DataWP>();
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetWorkPackagesSistema";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@SisCod", sisCod);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();
                while (lector.Read())
                {

                    int id = (int)lector["WkpCod"];
                    string nombre = (string)lector["WkpNom"];
                    DateTime fIni = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchIni"] == DBNull.Value)
                    {
                        fIni = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fIni = (DateTime)lector["WkpFchIni"];
                    }
                    DateTime fEnt = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchEnt"] == DBNull.Value)
                    {
                        fEnt = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fEnt = (DateTime)lector["WkpFchEnt"];
                    }
                    DateTime fEntEst = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchEntEst"] == DBNull.Value)
                    {
                        fEntEst = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fEntEst = (DateTime)lector["WkpFchEntEst"];
                    }
                    DateTime fFin = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchFin"] == DBNull.Value)
                    {
                        fFin = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fFin = (DateTime)lector["WkpFchFin"];
                    }
                    int estCod = (int)lector["WkpEstCod"];
                    string estNom = (string)lector["WkpEstNom"];
                    string final = (string)lector["WkpEstFin"];
                    bool esFinal = false;
                    if (final.Equals("S"))
                        esFinal = true;
                    DataEstadoWP estado = new DataEstadoWP(estCod, estNom, esFinal);
                    DataWP wp = new DataWP(id, nombre, fIni, fEntEst, fEnt, fFin, estado, sisCod);
                    listaWP.Add(wp);
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return listaWP;
        }

        public List<DataEstadoWP> GetEstadosWP()
        {
            List<DataEstadoWP> listaEstados = new List<DataEstadoWP>();
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetEstadosWP";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            SqlDataReader lector;
            try
            {
                cnn.Open();
                lector = cmd.ExecuteReader();
                while (lector.Read())
                {
                    int estCod = (int)lector["WkpEstCod"];
                    string estNom = (string)lector["WkpEstNom"];
                    string final = (string)lector["WkpEstFin"];
                    bool esFinal = false;
                    if (final.Equals("S"))
                        esFinal = true;
                    DataEstadoWP dataEstado = new DataEstadoWP(estCod, estNom, esFinal);
                    
                    listaEstados.Add(dataEstado);
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return listaEstados;
        }

        public void ModificarWP(DataWP wp)
        {
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);
            int afectados = -1;
            try
            {
                string textoComando = "ModificarWorkPackage";
                SqlCommand cmd = new SqlCommand(textoComando, cnn);
                cnn.Open();
                                        
                cmd.CommandType = CommandType.StoredProcedure;

                SqlParameter codigoWP = new SqlParameter("@WkpCod", wp.Id);
                SqlParameter nombreWP = new SqlParameter("@WkpNom", wp.Nombre);
                SqlParameter fchIniWP = new SqlParameter("@WkpFchIni", SqlDbType.DateTime);
                SqlParameter fchEntWP = new SqlParameter("@WkpFchEnt", SqlDbType.DateTime);
                SqlParameter fchEntEstWP = new SqlParameter("@WkpFchEntEst", SqlDbType.DateTime);
                SqlParameter fchFinWP = new SqlParameter("@WkpFchFin", SqlDbType.DateTime);
                SqlParameter estWP = new SqlParameter("@WkpEstCod ", wp.Estado.Codigo);
                if ((wp.FechaInicio).Equals(ConstantesMGI.FechaVacia))
                {
                    fchIniWP.IsNullable = true;
                    fchIniWP.Value = DBNull.Value;
                }
                else
                {
                    fchIniWP.Value = wp.FechaInicio;
                }
                if ((wp.FechaEntrega).Equals(ConstantesMGI.FechaVacia))
                {
                    fchEntWP.IsNullable = true;
                    fchEntWP.Value = DBNull.Value;
                }
                else
                {
                    fchEntWP.Value = wp.FechaEntrega;
                }
                if ((wp.FechaEstimadaEntrega).Equals(ConstantesMGI.FechaVacia))
                {
                    fchEntEstWP.IsNullable = true;
                    fchEntEstWP.Value = DBNull.Value;
                }
                else
                {
                    fchEntEstWP.Value = wp.FechaEstimadaEntrega;
                }
                if ((wp.FechaFin).Equals(ConstantesMGI.FechaVacia))
                {
                    fchFinWP.IsNullable = true;
                    fchFinWP.Value = DBNull.Value;
                }
                else
                {
                    fchFinWP.Value = wp.FechaFin;
                }

                SqlParameter retorno = new SqlParameter("@retorno", SqlDbType.Int);
                retorno.Direction = ParameterDirection.ReturnValue;

                cmd.Parameters.Add(codigoWP);
                cmd.Parameters.Add(nombreWP);
                cmd.Parameters.Add(fchIniWP);
                cmd.Parameters.Add(fchEntWP);
                cmd.Parameters.Add(fchEntEstWP);
                cmd.Parameters.Add(fchFinWP);
                cmd.Parameters.Add(estWP);
                cmd.Parameters.Add(retorno);
                cmd.ExecuteNonQuery();
                afectados = (int)cmd.Parameters["@retorno"].Value;

                if (afectados == 0)
                {
                    throw new NoExisteRegistroException("No existe el work package");
                }
                else if (afectados == -1)
                {
                    throw new Exception("Problemas en la base de datos");
                }
                else if (afectados == -2)
                {
                    throw new YAExisteRegistroException("Ya existe un work package para el sistema con ese nombre");
                }

            }
            catch (Exception e)
            {
                throw new Exception("Problemas: " + e.Message);
            }
            finally
            {
                cnn.Close();
            }
        }

        public DataWP GetWPPorId(int wpId)
        {
            DataWP wp;
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetWorkPackage";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@WkpCod", wpId);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {
               
                cnn.Open();
                lector = cmd.ExecuteReader();
                if(!lector.HasRows)
                {
                    throw new Exception("No existe work package con el código dado");
                }
                if (lector.Read())
                {
                    int id = (int)lector["WkpCod"];
                    string nombre = (string)lector["WkpNom"];
                    DateTime fIni = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchIni"] == DBNull.Value)
                    {
                        fIni = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fIni = (DateTime)lector["WkpFchIni"];
                    }
                    DateTime fEnt = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchEnt"] == DBNull.Value)
                    {
                        fEnt = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fEnt = (DateTime)lector["WkpFchEnt"];
                    }
                    DateTime fEntEst = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchEntEst"] == DBNull.Value)
                    {
                        fEntEst = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fEntEst = (DateTime)lector["WkpFchEntEst"];
                    }
                    DateTime fFin = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchFin"] == DBNull.Value)
                    {
                        fFin = ConstantesMGI.FechaVacia;
                    }
                    else
                    {
                        fFin = (DateTime)lector["WkpFchFin"];
                    }
                    int estCod = (int)lector["WkpEstCod"];
                    string estNom = (string)lector["WkpEstNom"];
                    string final = (string)lector["WkpEstFin"];
                    bool esFinal = false;
                    int idSistema = (int)lector["SisCod"];
                    if (final.Equals("S"))
                        esFinal = true;
                    DataEstadoWP estado = new DataEstadoWP(estCod, estNom, esFinal);
                    wp = new DataWP(id, nombre, fIni, fEntEst, fEnt, fFin, 0, 0, estado,idSistema);
                }
                else
                {
                    throw new NoExisteRegistroException("No hay un work package con el código dado");
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return wp;
       
        }

        public int GetIdSistemaWP(int wkpCod)
        {
            int idSistema;
            
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetWorkPackage";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@WkpCod", wkpCod);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();
                if (lector.Read())
                {
                    idSistema = (int)lector["SisCod"];
                    
                }
                else
                {
                    throw new NoExisteRegistroException("No hay un work package con el código dado");
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return idSistema;
        }

        public List<DataWPReporte> GetWorkPackagesDadosAltaPeriodo(int sisCod, DateTime perFchIni, DateTime perFchFin)
        {
            List<DataWPReporte> listaWP = new List<DataWPReporte>();
            string textoConexion = ConfigurationManager.AppSettings.Get("stringConection");
            SqlConnection cnn = new SqlConnection(textoConexion);

            string consulta = "GetWorkPackagesSistema";
            SqlCommand cmd = new SqlCommand(consulta, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter par = new SqlParameter("@SisCod", sisCod);
            cmd.Parameters.Add(par);
            SqlDataReader lector;
            try
            {

                cnn.Open();
                lector = cmd.ExecuteReader();
                while (lector.Read())
                {
                                      
                    DateTime fIni = ConstantesMGI.FechaVacia;
                    if (lector["WkpFchIni"] != DBNull.Value)
                    {
                        fIni = (DateTime)lector["WkpFchIni"];
                        if ((fIni.CompareTo(perFchIni) >= 0) && (fIni.CompareTo(perFchFin) <= 0))
                        {
                            int id = (int)lector["WkpCod"];
                            string nombre = (string)lector["WkpNom"];
                            DateTime fEnt = ConstantesMGI.FechaVacia;
                            if (lector["WkpFchEnt"] == DBNull.Value)
                            {
                                fEnt = ConstantesMGI.FechaVacia;
                            }
                            else
                            {
                                fEnt = (DateTime)lector["WkpFchEnt"];
                            }
                            DateTime fEntEst = ConstantesMGI.FechaVacia;
                            if (lector["WkpFchEntEst"] == DBNull.Value)
                            {
                                fEntEst = ConstantesMGI.FechaVacia;
                            }
                            else
                            {
                                fEntEst = (DateTime)lector["WkpFchEntEst"];
                            }
                            DateTime fFin = ConstantesMGI.FechaVacia;
                            if (lector["WkpFchFin"] == DBNull.Value)
                            {
                                fFin = ConstantesMGI.FechaVacia;
                            }
                            else
                            {
                                fFin = (DateTime)lector["WkpFchFin"];
                            }
                            int estCod = (int)lector["WkpEstCod"];
                            string estNom = (string)lector["WkpEstNom"];
                            string final = (string)lector["WkpEstFin"];
                            bool esFinal = false;
                            if (final.Equals("S"))
                                esFinal = true;
                            DataEstadoWP estado = new DataEstadoWP(estCod, estNom, esFinal);
                            string nombreSistema = (string)lector["SisNom"];
                            string nombreCliente = (string)lector["CliNom"];
                            DataWPReporte wp = new DataWPReporte(id, nombre, fIni,fEntEst, fEnt, fFin, estado, sisCod, nombreSistema, nombreCliente);
                            listaWP.Add(wp);
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos: " + ex.Message);
            }
            finally
            {
                cnn.Close();
            }
            return listaWP;
   
        }
    }
}
